// app.js或者自己的路由文件
const Koa = require('koa')
const app = new Koa()
const fs = require("fs");
const path = require("path");
const koaBody = require("koa-body"); // npm i koa-body
const { format } = require("date-fns"); // npm i date-fns
const Router = require('koa-router')
const router = new Router()
const cors = require('@koa/cors')
const KoaStatic = require('koa-static')

// POST@/upload
router.post("/upload", koaBody({
    multipart: true, // 支持多文件上传
    encoding: "gzip", // 编码格式
    formidable: {
      uploadDir: path.join(__dirname, "/public/upload/"), // 设置文件上传目录
      keepExtensions: true, // 保持文件的后缀
      maxFieldsSize: 10 * 1024 * 1024, // 文件上传大小限制
      onFileBegin: (name, file) => {
        // 无论是多文件还是单文件上传都会重复调用此函数
        // 最终要保存到的文件夹目录
        const dirName = format(new Date(), "yyyyMMdd");
        const dir = path.join(__dirname, `public/upload/${dirName}`);
        // 检查文件夹是否存在如果不存在则新建文件夹
        if (!fs.existsSync(dir)) {
            fs.mkdirSync(dir);
          }
        // 文件名称去掉特殊字符但保留原始文件名称
        const fileName = file.newFilename.replace(/[`~!@#$%^&*()|\-=?;:'",<>\{\}\\\/]/gi, "_");
        file.name = fileName;
        // 覆盖文件存放的完整路径(保留原始名称)
        file.path = `${dir}/${fileName}`;
        
      },
      onError: (error) => {
        app.status = 400;
        log4js.error(error);
        // 这里可以定义自己的返回内容
        app.body = { code: 400, msg: "上传失败", data: {} };
        return;
      }
    }
  }),

  async (ctx) => {
    try {
      // 获取上传文件
      const files = ctx.request.files
      // 移动上传的图片到指定文件夹内用作回显
      /**
       * @param path 图片当前位置
       * @param targetPath 图片目标存放位置
       * @param Func callback 回调  
       */
      // fs.rename(path, targetPath, callback)
      fs.rename(files.file.filepath, files.file.path, err => {
        if (err) throw err;
        fs.stat(files.file.path, (err, stats) => {
          if (err) throw err;
          // console.log('stats: ' + JSON.stringify(stats));
        });
      })
      // 正则 替换掉文件原始路径中不需要的部分
      const reg = new RegExp(".*/upload/", "g");
      for (const fileKey in files) {
        ctx.uploadpaths = ctx.uploadpaths ? ctx.uploadpaths : [];
        ctx.uploadpaths.push({
          name: files[fileKey].name,
          url: files[fileKey].path.replace(reg, ""),
        });
      }
      // console.log(ctx.uploadpaths)
      ctx.body = { code: 200, msg: "上传成功", data:{ uploadpaths: ctx.uploadpaths }};
    } catch (error) {
      ctx.status = 400;
      ctx.body = { code: 400, msg: "上传失败", data: {} };
    }
  }
);
app.use(cors())
app.use(KoaStatic(path.join(__dirname, '/public/upload')))
app.use(router.routes())
app.listen(3000, () => {
    console.log('Server is running at http://localhost:3000')
})